home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Tools / Dev / mamesrc / src / amiga / file.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-12-03  |  6.2 KB  |  297 lines

  1. /**************************************************************************
  2.  *
  3.  * Copyright (C) 1999 Mats Eirik Hansen (mats.hansen@triumph.no)
  4.  *
  5.  * $Id: file.c,v 1.1 1999/04/28 18:52:08 meh Exp meh $
  6.  *
  7.  * $Log: file.c,v $
  8.  * Revision 1.1  1999/04/28 18:52:08  meh
  9.  * Initial revision
  10.  *
  11.  *
  12.  *************************************************************************/
  13.  
  14. #include <stdio.h>
  15.  
  16. #include <exec/types.h>
  17. #include <exec/memory.h>
  18.  
  19. #include <inline/exec.h>
  20. #include <inline/dos.h>
  21.  
  22. #ifdef POWERUP
  23. #include <powerup/ppclib/memory.h>
  24. #include <inline/ppc.h>
  25. #endif
  26.  
  27. #include "main.h"
  28. #include "file.h"
  29. #include "osdepend.h"
  30.  
  31. #ifndef POWERUP
  32. #define MAlloc(a) AllocVec(a,MEMF_PUBLIC|MEMF_CLEAR)
  33. #define Free(a)   FreeVec(a)
  34. #else
  35. #define MAlloc(a) PPCAllocVec(a,MEMF_PUBLIC|MEMF_CLEAR|MEMF_NOCACHESYNCPPC|MEMF_NOCACHESYNCM68K)
  36. #define Free(a)   PPCFreeVec(a)
  37. #endif
  38.  
  39. struct File *OpenFile(const char *dir_name, const char *file_name, int mode)
  40. {
  41.   struct File *file;
  42.   BPTR    lock;
  43.   LONG    i;
  44.  
  45.   file = MAlloc(sizeof(struct File));
  46.   
  47.   if(file)
  48.   {
  49.     i = strlen(dir_name);
  50.  
  51.     if(i)
  52.     {
  53.       sprintf(file->Name, "%s/%s", dir_name, file_name);
  54.  
  55.       file->File  = Open(file->Name, mode);
  56.       file->Type  = FILETYPE_NORMAL;
  57.       
  58.       if(!file->File && i && (mode == MODE_OLDFILE))
  59.       {
  60.         sprintf(&file->Name[i], ".zip");
  61.  
  62.         lock = Lock(file->Name, ACCESS_READ);
  63.   
  64.         if(lock)
  65.         {
  66.           file->File  = ~0;
  67.           file->Type  = FILETYPE_ZIP;
  68.         }
  69.         else
  70.         {
  71.           sprintf(&file->Name[i], ".lha");
  72.  
  73.           lock = Lock(file->Name, ACCESS_READ);
  74.   
  75.           if(lock)
  76.             sprintf(file->Name, "lha <>NIL: e %s.lha %s T:", dir_name, file_name);
  77.           else
  78.           {
  79.             sprintf(&file->Name[i], ".lzx");
  80.  
  81.             lock = Lock(file->Name, ACCESS_READ);
  82.   
  83.             if(lock)
  84.               sprintf(file->Name, "lzx <>NIL: x %s.lzx %s T:", dir_name, file_name);
  85.           }
  86.  
  87.           if(lock)
  88.           {
  89.             System(file->Name, NULL);
  90.           
  91.             sprintf(file->Name,"T:%s", file_name);
  92.           
  93.             file->File  = Open(file->Name, mode);
  94.             file->Type  = FILETYPE_TMP;
  95.           }
  96.         }
  97.  
  98.         if(lock)
  99.           UnLock(lock);
  100.       }
  101.     }
  102.     else
  103.     {
  104.       file->File  = Open((STRPTR) file_name, mode);
  105.       file->Type  = FILETYPE_NORMAL;
  106.     }
  107.     
  108.     if(!file->File)
  109.     {
  110.       Free(file);
  111.       return(NULL);
  112.     }
  113.   }
  114.  
  115.   return(file);
  116. }
  117.  
  118. struct File *OpenFileType(const char *dir_name, const char *file_name, int mode, int type)
  119. {
  120.   struct File *file;
  121.   const char  *path;
  122.  
  123.   char name[256];
  124.   int  path_len;
  125.   int  path_num;
  126.   BPTR lock;
  127.  
  128.   file = NULL;
  129.  
  130.   switch(type)
  131.   {
  132.     case OSD_FILETYPE_ROM:
  133. #ifdef MESS
  134.     case OSD_FILETYPE_ROM_CART:
  135.     case OSD_FILETYPE_IMAGE:
  136. #endif
  137.       for(path_num = 0;
  138.           (path = GetRomPath(Config[CFG_DRIVER], path_num)) != NULL;
  139.           path_num++)
  140.       {
  141.         path_len = strlen(path);
  142.         
  143.         if(path_len)
  144.         {
  145.           strcpy(name, path);
  146.  
  147.           if((name[path_len - 1] != ':') && (name[path_len - 1] != '/'))
  148.             name[path_len++] = '/';
  149.  
  150.           sprintf(&name[path_len], "%s", dir_name);
  151.  
  152.           file = OpenFile(name, file_name, mode);
  153.         
  154.           if(!file)
  155.           {
  156.             name[path_len] = 0;
  157.             file = OpenFile(name, file_name, mode);
  158.           }
  159.         }
  160.       }
  161.  
  162.       if(!file)
  163.       {
  164.         sprintf(name, "roms/%s", dir_name);
  165.         file = OpenFile(name, file_name, mode);
  166.       }
  167.  
  168.       if(!file)
  169.         file = OpenFile(dir_name, file_name, mode);
  170.  
  171.       return(file);
  172.  
  173.     case OSD_FILETYPE_SAMPLE:
  174.       for(path_num = 0;
  175.           (path = GetSamplePath(Config[CFG_DRIVER], path_num)) != NULL;
  176.           path_num++)
  177.       {
  178.         path_len = strlen(path);
  179.         
  180.         if(path_len)
  181.         {
  182.           strcpy(name, path);
  183.  
  184.           if((name[path_len - 1] != ':') && (name[path_len - 1] != '/'))
  185.             name[path_len++] = '/';
  186.  
  187.           sprintf(&name[path_len], "%s", dir_name);
  188.  
  189.           file = OpenFile(name, file_name, mode);
  190.         
  191.           if(!file)
  192.           {
  193.             name[path_len] = 0;
  194.             file = OpenFile(name, file_name, mode);
  195.           }
  196.         }
  197.       }
  198.  
  199.       if(!file)
  200.       {
  201.         sprintf(name, "samples/%s", dir_name);
  202.         file = OpenFile(name, file_name, mode);
  203.       }
  204.  
  205.       for(path_num = 0;
  206.           (path = GetRomPath(Config[CFG_DRIVER], path_num));
  207.           path_num++)
  208.       {
  209.         path_len = strlen(path);
  210.         
  211.         if(path_len)
  212.         {
  213.           strcpy(name, path);
  214.  
  215.           if((name[path_len - 1] != ':') && (name[path_len - 1] != '/'))
  216.             name[path_len++] = '/';
  217.  
  218.           sprintf(&name[path_len], "%s", dir_name);
  219.  
  220.           file = OpenFile(name, file_name, mode);
  221.         
  222.           if(!file)
  223.           {
  224.             name[path_len] = 0;
  225.             file = OpenFile(name, file_name, mode);
  226.           }
  227.         }
  228.       }
  229.  
  230.       if(!file)
  231.       {
  232.         sprintf(name, "roms/%s", dir_name);
  233.         file = OpenFile(name, file_name, mode);
  234.       }
  235.  
  236.       if(!file)
  237.         file = OpenFile(dir_name, file_name, mode);
  238.  
  239.       if(!file)
  240.         file = OpenFile("roms", file_name, mode);
  241.  
  242.       if(!file)
  243.         file = OpenFile("", file_name, mode);
  244.  
  245.       return(file);
  246.  
  247.     case OSD_FILETYPE_HIGHSCORE:
  248.       if(mode == MODE_NEWFILE)
  249.       {
  250.         lock = Lock("hi", ACCESS_READ);
  251.  
  252.         if(!lock)
  253.           lock = CreateDir("hi");
  254.  
  255.         if(lock)
  256.           UnLock(lock);       
  257.       }
  258.       sprintf(name, "%s.hi", dir_name);
  259.       return(OpenFile("hi", name, mode));
  260.  
  261.     case OSD_FILETYPE_CONFIG:
  262.       if(mode == MODE_NEWFILE)
  263.       {
  264.         lock = Lock("cfg", ACCESS_READ);
  265.         
  266.         if(!lock)
  267.           lock = CreateDir("cfg");
  268.  
  269.         if(lock)
  270.           UnLock(lock);
  271.       }
  272.       sprintf(name, "%s.cfg", dir_name);
  273.       return(OpenFile("cfg", name, mode));
  274.  
  275.     case OSD_FILETYPE_INPUTLOG:
  276.       sprintf(name, "%s.inp", file_name);
  277.       return(OpenFile("", name, mode));
  278.  
  279.     default:
  280.       return(NULL);
  281.   }
  282. }
  283.  
  284. void CloseFile(struct File *file)
  285. {
  286.   if(file->Type != FILETYPE_CUSTOM)
  287.   {
  288.     if(file->Type != FILETYPE_ZIP)
  289.       Close(file->File);
  290.   
  291.     if(file->Type == FILETYPE_TMP)
  292.       DeleteFile(file->Name);
  293.   
  294.     Free(file);
  295.   }
  296. }
  297.